const fs = require('node:fs')
const path = require('node:path')



// 次数统计
const maxCount = 4
// 离开时间
const leaveTime = 2500 // ms

function writeLog(message) {
    const logString = `${new Date().toLocaleString()} --- ${message}`
    console.log(logString);

    // 绝对地址
    const logPath = path.resolve(__dirname, '../logs/log.txt')
    // 将日志写到文件中
    fs.appendFileSync(logPath, logString + '\n')
}



const useSetRfidJudgment = () => {

    const rfidStorage = {}

    const onEnter = (config) => {
        const { key, rfid } = config
        const ids = rfidStorage[key] || []
        // 已经进入则不执行
        if (ids.includes(rfid)) return
        ids.push(rfid)
        rfidStorage[key] = ids
        // rfid 进入指定区域
        writeLog(` ${key} === ${rfid} 进入`)
    }

    const onLeave = ({ key, rfid }) => {
        const ids = rfidStorage[key] || []
        const index = ids.indexOf(rfid)
        if (index >= 0) {
            ids.splice(index, 1)
            writeLog(` ${key} === ${rfid} 离开`)
        }
        rfidStorage[key] = ids
    }


    const on_set_rfid = (config) => {
        const { key, rfid } = config
        // 赋值初始值
        const ids = rfidStorage[key] || []

        const isExist = ids.includes(rfid)

        // 不存在,添加
        if (rfid && !isExist) {
            // 进入时,如果有缓存,则删除缓存
            Object.keys(rfidStorage).map((key) => {
                onLeave({ key, rfid })
            })

            onEnter(config)
        }

    }


    const timers = {};

    const rfidConfigCount = {}
    const on_set_rfid_judgment = (config) => {
        const { rfid, key } = config;

        clearTimeout(timers[rfid]);

        // 1. 长时间未进入离开，重置
        timers[rfid] = setTimeout(() => {
            rfidConfigCount[rfid] = null
            // rfid 离开区域
            onLeave(config)
        }, leaveTime);

        // 进入,统计次数
        const detail = rfidConfigCount[rfid] || {}
        if (!detail[key]) detail[key] = {
            config: config,
            count: 0,
        }


        // 2. 每次进入收集统计次数，每5次进行一次设置

        // 给对应的天线区域 key 累加次数
        detail[key].count++


        // 判断所有天线的次数,达到5次后,进行判断
        const rfidCount = Object.values(detail).reduce((sum, item) => sum + item.count, 0)

        // 3. 判断5次中，命中哪个最高，就执行设置
        if (rfidCount >= maxCount) {

            // 计算哪个天线的的次数最高
            // 循环 detail 判断 count 最高,返回对应的 key
            const maxKey = Object.keys(detail).reduce((maxKey, key) => {
                const count = detail[key].count
                return count > detail[maxKey].count ? key : maxKey
            })

            // 获取 count 最高的 key,设置到指定的天线上
            const setConfig = detail[maxKey].config

            on_set_rfid(setConfig)
            rfidConfigCount[rfid] = null
        } else {
            rfidConfigCount[rfid] = detail
        }
    }


    return {
        on_set_rfid_judgment
    }
}

const { on_set_rfid_judgment } = useSetRfidJudgment()


module.exports = {
    on_set_rfid_judgment
}